#include <iostream>
#include <string>
#include <regex>

int main()
{
    // HTTP请求的格式
    // "GET /www.baidu.com/login?usrname=zhangsan&pwd=123123 HTTP/1.1"
    // "GET /www.baidu.com/login?usrname=zhangsan&pwd=123123 HTTP/1.1\n"
    // "GET /www.baidu.com/login?usrname=zhangsan&pwd=123123 HTTP/1.1\r\n"
    std::string str = "GET /www.baidu.com/login HTTP/1.1\r\n";
    // 获取请求方法 + 资源路径 + 查询字符串(可能存在也可能不存在) + 版本 + 分隔符
    std::regex e("(GET|PUT|DELET|POST|HEAD) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?"); 
    // ()中是要匹配提取的内容
    // [^?]表示匹配提取非问号字符
    // [^?]后面的*表示提取0次或者n次因为可能GET后面可能没有要访问的对应资源
    // \\?表示原始的?字符，?字符是个特殊的字符，用两个\就可以表示原始的?字符
    // (HTTP/1\\.[01])表示以HTTP/1.开始的后面跟了一个0或者1的字符串
    // (?:\n|\r\n)? 括号里面的?:表示要匹配的字符串但是不捕捉，括号外面的表示匹配一次或者0次

    std::smatch matches;
    bool ret = std::regex_match(str, matches, e);

    // int i = 1;
    // for(auto &e : matches)
    // {
    //     std::cout<<i++<<" "<<e<<std::endl;
    // }

    for(int i = 0; i<5; i++)
    {
        std::cout<<i<<" "<<matches[i]<<std::endl;
    }
    return 0;
}